<?php
class User_User extends ActiveRecord {

	public $tableName = 'user';
	public $pkName = 'ID_user';

	protected $essenceType = 2;

	protected $validatesUniquenessOf = array('e_mail' => array('message' => 'это адрес электронной почты уже используется', 'on' => 'create'),
																					 'login' => array('message' => 'это логин уже используется', 'on' => 'create'),
	                                         );
	protected $validatesLengthOf = array(/*'first_name' => array('minimum' => 2, 'maximum' => 24, 'message' => 'введите имя от 2 до 24 символов'),
																			 'last_name' => array('minimum' => 2, 'maximum' => 24, 'message' => 'введите фамилию от 2 до 24 символов)'),
																			 */
	                                     'pass' => array('minimum' => 6, 'maximum' => 32, 'message' => 'используйте пароль длиной от 6 до 32 символов', 'on' => 'create'),
	                                     'login' => array('minimum' => 2, 'maximum' => 32, 'message' => 'используйте логин длиной от 6 до 32 символов', 'on' => 'create'));
	protected $validatesConfirmationOf = array('pass' => array('message' => 'пароли не совпадают', 'on' => 'create'));
	//protected $validatesAcceptanceOf = array('confirm' => array('message' => 'you must be agree to the terms of use', 'on' => 'create'));
	protected $validatesFormatOf = array('e_mail' => array('message' => 'адрес электронной почты введен неправильно', 'with' => '|^[\.\-_A-Za-z0-9]+?@[\.\-A-Za-z0-9]+?\.[A-Za-z0-9]{2,6}$|', 'on' => 'create'),
																			 'login' => array('message' => 'логин введен неправильно', 'with' => '|^[[A-Za-z0-9\-\.]{2,32}$|', 'on' => 'create'));


	public $arrFavoriteUsers = array(); // контейнер для сохранения аватары (нужно называть именно так)
	public $image = null; // контейнер для сохранения аватары (нужно называть именно так)
	protected $arrSettings = array('created_at' => true,  // в БД храним вмеря создания
																 'updated_at' => true, 	// в БД храним вмеря редактирования
																 'image' => true);			// в БД храним аватар (не забываем про атрибут класса image)

  public function __construct($arrInitialFields = null) {
		parent::__construct($arrInitialFields);
  }

  /**
   * Метод проверяет соответствие логина+пароля значениям, содержащимся в базе.
   *
   * @param string $loginOrEMail - логин или e-mai
   * @param string $md5Password - пароль после хеширования
   * @return mixed - Возвращает false или ID пользователя
   */
  public static function login($loginOrEMail = null, $md5Password = null) {
  	if (Service_Mail::isEMailCorrect($loginOrEMail))
  	  return self::loginByEMail($loginOrEMail, $md5Password);
  	else
  	  return self::loginByLogin($loginOrEMail, $md5Password);
  }

  /**
   * Метод проверяет соответствие логина+пароля значениям, содержащимся в базе.
   *
   * @param string $login - логин
   * @param string $md5Password - пароль после хеширования
   * @return mixed - Возвращает false или ID пользователя
   */
  public static function loginByLogin($login = null, $md5Password = null) {
  	$stmt = "SELECT `ID_user` FROM `user` WHERE `pass` = '" . $md5Password . "' AND `login` = '" . $login . "' AND `approved`=1 AND `is_deleted` = 0";
  	$objDB = Service_Database::instance();
  	return $objDB->selectSimpleField($stmt);
  }

  /**
   * Метод проверяет соответствие логина+пароля значениям, содержащимся в базе.
   *
   * @param string $eMail - e-mail
   * @param string $md5Password - пароль после хеширования
   * @return mixed - Возвращает false или ID пользователя
   */
  public static function loginByEMail($eMail = null, $md5Password = null) {
  	if (!Service_Mail::isEMailCorrect($eMail)) {
			Exception_ActiveRecord::addObjectException('User_User', 'e_mail', 'the e-mail entered incorrectly');
	  	return false;
	  }
		$stmt = "SELECT `ID_user` FROM `user` WHERE `pass` = '" . $md5Password . "' AND `e_mail` = '" . $eMail . "' AND `approved`=1 AND `is_deleted` = 0";
		$objDB = Service_Database::instance();
		return $objDB->selectSimpleField($stmt);
  }

	  /**
	   * Метод проверяет, корректно ли введен адрес электроноой почты
	   *
	   * @param string $strEMail - e-mail
	   */
	  public static function isLoginCorrect($strLogin) {
	    return preg_match("/^[A-Za-z0-9]{3,32}$/", $strLogin);
	  }

	/**
	 * Функция проверяет, существует ли данный EMail в БД
	 *
	 * @param $strEMail - строковое представление EMail
	 * @return true (если EMail присутствует в БД) или false
	 */
  public static function isEMailExist($strEMail) {
    $objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM `user` WHERE `e_mail` = '" . $strEMail . "'";  //формируем SQL-запрос
    return (sizeof($objDB->select($stmt))>0) ? true : false;  //Осуществляем SQL-запрос
  }

	/**
	 * Функция проверяет, существует ли данный EMail в БД
	 *
	 * @param $strEMail - строковое представление EMail
	 * @return true (если EMail присутствует в БД) или false
	 */
  public static function isLoginExist($login) {
    $objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM `user` WHERE `login` = '" . $login . "'";  //формируем SQL-запрос
    return (sizeof($objDB->select($stmt)) > 0) ? true : false;  //Осуществляем SQL-запрос
  }

	/**
	 * Функция проверяет, существует ли данный EMail и Логину в БД
	 *
	 * @param $strEMail - строковое представление EMail
	 * @param $strLogin - строковое представление логина
	 */
  public static function isEMailAndLoginExist($strEMail, $strLogin) {
    $objDB = Service_Database::instance();//Получаем подключение к БД
    $stmt = "SELECT `ID_user` FROM `user` WHERE `e_mail` = '" . $strEMail . "' AND  `login` = '" . $strLogin . "'";  //формируем SQL-запрос
    return (sizeof($objDB->select($stmt)) > 0);  //Осуществляем SQL-запрос
  }

	/**
	 * Добавляет +1 к хитам пользователя
	 */
  public static function addHit() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "UPDATE `user`
    				 SET  `hits` = (`hits`+1)
   					 WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}

	/**
	 * Устанавливает время последнего входа
	 */
	public static function setLoginTime() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "UPDATE `user`
    				 SET  `login_time` = '" . Service_Date::gLocalTime2BD() . "'
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}


	/**
	 * Получаем избранных пользователей
	 */
	public function getFavouriteUsers($stmtOrder = null) {
		$objDB = Service_Database::instance();
		$stmt  = "
		SELECT `user`.*, `favorite_guide`.`ID_user` AS is_favorite
		FROM `favorite_guide`
		LEFT JOIN `user` ON `favorite_guide`.`ID_guide` = `user`.`ID_user`
		WHERE `favorite_guide`.`ID_user` = " . $this->id;
		if ($stmtOrder) $stmt .= " ORDER BY " . $stmtOrder;
		return $objDB->select($stmt);
	}


	/**
	 * Получаем избранных пользователей
	 */
	public function getFavoriteTours($stmtOrder = null) {
		$objDB = Service_Database::instance();
		$stmt  = "
		SELECT `typical_page`.`ID_typical_page`,
					 `typical_page`.`url`,
					 `typical_page`.`rating`,
					 `typical_page`.`ID_user`,
					 `typical_page`.`annotation`,
					 `typical_page`.`title`,
					 `typical_page`.`ID_city`,
					 `typical_page`.`ID_country`,
					 `typical_page`.`page_name`,
					 `typical_page`.`pic_file` AS `tp_avatar`,
					 `city`.`city_name` AS `city_main_name`,
					 `country`.`country_name` AS `country_main_name`,
					 `user`.`login`,
					 `user`.`first_name`,
					 `user`.`last_name`,
					 `user`.`is_guide`
		FROM `favorite_typical_page`
		LEFT JOIN `typical_page` ON `favorite_typical_page`.`ID_typical_page` = `typical_page`.`ID_typical_page`
		LEFT JOIN `user` ON `user`.`ID_user` = `typical_page`.`ID_user`
		LEFT JOIN `city` ON `city`.`ID_city` = `typical_page`.`ID_city`
		LEFT JOIN `country` ON `country`.`ID_country` = `typical_page`.`ID_country`
		WHERE `favorite_typical_page`.`ID_user` = " . $this->id;
		if ($stmtOrder) $stmt .= " ORDER BY " . $stmtOrder;
		return $objDB->select($stmt);
	}

	/**
	 * Добавляет +1 к посещениям пользователя
	 */
	public static function addVisit() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		$userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "UPDATE `user`
    				 SET  `visits` = (`visits`+1)
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
		return $objDB->query($stmt);
	}

	/**
	 * Устанавливает статус присутствия пользователя на сайте
	 *
	 * @param $status - статус пользователя
	 * @param $userId - id пользователя
	 */
	public static function setStatus($status, $userId) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		if (!$userId) $userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "UPDATE `user`
    				 SET  `user_status` = '" . $status . "'
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
	  return $objDB->query($stmt);
	}

	/**
	 * Метод устанавливает нулевой статус всем пользователям, которые не присутствуют на сайте уже 15 минут
	 */
	public static function setZeroStatusByTimeOut() {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="
		UPDATE `user`
    LEFT JOIN `session` ON `session`.`ID_user` = `user`.`ID_user`
    SET  `user_status` = 0
    WHERE (`session`.`last_impression` IS NULL) OR (`session`.`last_impression` < DATE_SUB(now(), INTERVAL 15 MINUTE));";
		return $objDB->query($stmt);
	}

	/**
	 * получение id пользователя по логину
	 *
	 * @param $login - логин пользователя
	 * @return id пользователя
	 */
	public static function getIdByLogin($login) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `ID_user` FROM `user` WHERE `login`='" . $login . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получает id пользователя
	 *
	 * @return integer id пользователя
	 */
	public static function getId() {
		$objSesion = User_Session::instance();
		return $objSesion->getUserId();
	}

  /**
   * Восстновление пароля
   *
   * @param  $strEMail - электронная почта
   */
	public function recoveryPass($strEMail) {
	  $objSession = User_Session::instance();
    if (!isset($this->tableFields['kaptcha']) || empty($this->tableFields['kaptcha']) || ($objSession->__get('keystring') != $this->tableFields['kaptcha'])) {
      Exception_ActiveRecord::addObjectException(get_class($this), 'kaptcha', 'неправильно введен код с картинки');
      return false;
    }
    elseif (Service_Mail::isEMailCorrect($this->tableFields['e_mail'])) {
    	//if (!$this->isEMailAndLoginExist($this->tableFields['e_mail'] ,$this->tableFields['login'])) {
    	if (!$this->isEMailExist($this->tableFields['e_mail'])) {
    	  //Exception_ActiveRecord::addObjectException('User_User', 'e_mail', 'Пользователь с такой эл. почтой и логином незарегистрирован');
    	  Exception_ActiveRecord::addObjectException('User_User', 'e_mail', 'этот адрес электронной почты уже используется');
        return false;
    	}
    }
    else {
    	Exception_ActiveRecord::addObjectException('User_User', 'e_mail', 'the e-mail entered incorrectly');
    	return false;
    }

		$new_pass = Service_Generate::generatePassword();
    $objDB = Service_Database::instance();//Получаем подключение к БД

    $objDB->update('user', array('pass' => md5($new_pass)), array('e_mail' => $this->tableFields['e_mail']));
    $userLogin = self::getUserLoginByEmail($strEMail);
    User_Notification::recoveryPass($strEMail, $new_pass, $userLogin);
    return $new_pass;
  }

  /**
   * получаем логин по id
   *
   * @param integer $userId - id пользователя
   * @return string догин пользователя
   */
	public static function getUserLogin($userId) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `login` FROM `user` WHERE `ID_user`='" . $userId . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получаем логин по e-mail
	 *
	 * @param string $strEMail - e-mail
	 * @return string догин пользователя
	 */
	public static function getUserLoginByEmail($strEMail) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `login` FROM `user` WHERE `e_mail`='" . $strEMail . "'";
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Получаем e-mail по id
	 *
	 * @param string $idUser - id пользователя
	 * @return string e-mail
	 */
	public static function getUserEmail($idUser) {
		$objDB = Service_Database::instance();//Получаем подключение к БД
		$stmt ="SELECT `e_mail` FROM `user` WHERE `ID_user`='" . $idUser . "'";
		return $objDB->selectSimpleField($stmt);
	}

  /**
   * Метод вызывается перед регистрацией пользователя
   */
	public function beforeValidationOnCreate () {
	  $this->tableFields['approved'] = 1; //новый  пользователь не подтверждён
	  $objSession = User_Session::instance();
    if (!isset($this->tableFields['kaptcha']) || empty($this->tableFields['kaptcha']) || ($objSession->__get('keystring')!=$this->tableFields['kaptcha'])) {
      Exception_ActiveRecord::addObjectException(get_class($this), 'kaptcha', 'неправильно введен код с картинки');
    }

    //if (empty($this->tableFields['pass'])) Exception_ActiveRecord::addObjectException(get_class($this), 'pass', 'the password is the wrong length (should be 6-32 characters)');

	}

  /**
   * Метод вызывается перед сохранением в БД
   */
  public function beforeSave() {
    if (isset($this->tableFields['kaptcha'])) {
      $keyString = $this->tableFields['kaptcha'];
      unset($this->tableFields['kaptcha']);
    }
    if (isset($this->tableFields['pass_confirmation'])) unset($this->tableFields['pass_confirmation']);
    //генерируем слово для подтверждения по почте
    $this->tableFields['approve_code'] = md5(Service_Generate::generateWord(20)); //код для подтверждения регистрации
  }
  
  public function beforeCreate() {
    $this->tableFields['pass'] = md5($this->tableFields['pass']);
  }

  /**
   * сохранение настроек пользователя
   */
  public function saveSettings() {
  	$arrError = $this->checkSettingsCorrect();
  	if ($arrError)
  		foreach ($arrError as $field=>$errText)
  			$this->errorValidated($field, $this->tableFields, $errText);
  	else {
  		$this->beforeSettingsUpdate();
  		$objDB = Service_Database::instance();
  		$stmt = "
  		UPDATE `user`
  		SET `get_message_notifications` = " . $this->tableFields['get_message_notifications'] . ",
  				`get_comment_notifications` = " . $this->tableFields['get_comment_notifications'] . ",
  				`get_review_notifications` = " . $this->tableFields['get_review_notifications'] .
  				(isset($this->tableFields['pass']) ? ", `pass` = '" . $this->tableFields['pass'] . "'" : '') . "
  		WHERE `user`.`ID_user` = " . $this->tableFields['ID_user'];
  		return $objDB->query($stmt);
  	}
  }

  /**
   * проверка настроек пользователя на корректность
   *
   * @param $objUser - объект пользователя
   */
  public function checkSettingsCorrect() {
  	$arrError = array();
    if (isset($this->tableFields['get_message_notifications'])) $this->tableFields['get_message_notifications'] = 1;
		else $this->tableFields['get_message_notifications'] = 0;

		if (isset($this->tableFields['get_comment_notifications'])) $this->tableFields['get_comment_notifications'] = 1;
		else $this->tableFields['get_comment_notifications'] = 0;

		if (isset($this->tableFields['get_review_notifications'])) $this->tableFields['get_review_notifications'] = 1;
		else $this->tableFields['get_review_notifications'] = 0;

		if (!empty($this->tableFields['old_pass']) OR !empty($this->tableFields['new_pass']) OR !empty($this->tableFields['pass_confirmation'])) {
			if (empty($this->tableFields['old_pass'])) $arrError['old_pass'] = 'введите старый пароль';
			if (empty($this->tableFields['new_pass'])) $arrError['new_pass'] = 'введите новый пароль';
			if (empty($this->tableFields['pass_confirmation'])) $arrError['pass_confirmation'] = 'введите новое подтверждение пароля';

			if (6 > strlen($this->tableFields['new_pass']) OR strlen($this->tableFields['new_pass']) > 32) $arrError['new_pass'] = 'используйте пароль длиной от 6 до 32 символов';
			else {
				$this->tableFields['old_pass'] = md5($this->tableFields['old_pass']);
				$this->tableFields['new_pass'] = md5($this->tableFields['new_pass']);
				$this->tableFields['pass_confirmation'] = md5($this->tableFields['pass_confirmation']);

				if ($this->tableFields['old_pass'] != User_User::getPass($this->tableFields['ID_user'])) $arrError['old_pass'] = 'старый пароль введен неверно';
				if ($this->tableFields['pass_confirmation'] != $this->tableFields['new_pass']) $arrError['pass_confirmation'] = 'the new password confirmation doesn\'t math';
			}
		}
		return $arrError;
  }

  /**
   * функция вызывается перед обновлением настроек пользователя
   *
   */
	public function beforeSettingsUpdate() {
		if ($this->tableFields['new_pass']) $this->tableFields['pass'] = $this->tableFields['new_pass'];
		unset($this->tableFields['old_pass']);
		unset($this->tableFields['new_pass']);
		unset($this->tableFields['pass_confirmation']);
  }

  /**
   * Проврека является ли пользователь администратором
   *
   * @param integer $userId - id пользоватнля
   * @return bool
   */
	public static function checkIfUserIsAdmin($userId = NULL) {
	  $objDB = Service_Database::instance();//Получаем подключение к БД
		$objSession = User_Session::instance();
		if (!$userId) $userId = $objSession->getUserId();
		if (!$userId) return null;
	  $stmt = "SELECT `is_admin`
    				 FROM `user`
    				 WHERE `user`.`ID_user` = '" . $userId . "'";
	  $res = $objDB->selectSimpleField($stmt);
	  return (int)$res > 0;
	}

	/**
	 * hkexftv пароль пользователя
	 */
	public static function getPass($idUser) {
		$objDB = Service_Database::instance();
		$stmt = '
		SELECT `pass`
		FROM `user`
		WHERE `user`.`ID_user` = ' . $idUser;
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * Удаление пользователя
	 *
	 */
	public function delete($id = null) {
		$objDB = Service_Database::instance();
		// Удаляем из избранного
		$stmt = "SELECT ID_typical_page FROM favorite_typical_page WHERE ID_user = '" . $this->id . "'";
		$arrTypicalPagesIds = $objDB->selectSimpleArray($stmt);
		if (sizeof($arrTypicalPagesIds)) {
			foreach ($arrTypicalPagesIds as $typicalPageId) {
				$objTypicalPage = new TypicalPage($typicalPageId);
				$objTypicalPage->removeEssenceFromFavorites($this->id);
			}
		}
		$stmt = "SELECT ID_guide FROM favorite_guide WHERE ID_user = '" . $this->id . "'";
		$arrGuidesIds = $objDB->selectSimpleArray($stmt);
		if (sizeof($arrGuidesIds)) {
			foreach ($arrGuidesIds as $guideId) {
				$objGuide = new User_Guide($guideId);
				$objGuide->removeEssenceFromFavorites($this->id, 'favorite_guide', 'ID_guide');
			}
		}
		$stmt = "SELECT ID_user FROM favorite_guide WHERE ID_guide = '" . $this->id . "'";
		$arrUsersIds = $objDB->selectSimpleArray($stmt);
		$objGuide = new User_Guide($this->id);
		if (sizeof($arrUsersIds)) {
			foreach ($arrUsersIds as $userId) {
				$objGuide->removeEssenceFromFavorites($userId, 'favorite_guide', 'ID_guide');
			}
		}
		// Удаляем сообщения пользователя
		$stmt = "SELECT ID_chain FROM chain WHERE ID_first_user = '" . $this->id . "' OR ID_second_user = '" . $this->id . "'";
		$arrChainsIds = $objDB->selectSimpleArray($stmt);
		if (sizeof($arrChainsIds)) {
			foreach ($arrChainsIds as $chainId) {
				Message::makeMessagesFromChainRemoved($chainId, $this->id);
			}
		}
		// Удаляем оценки
		$objPoll = new Poll();
		while ($objPoll->find('first', array('conditions' => 'ID_user = "' . $this->id . '"'))) {
			$objPoll->delete();
		}
		// Удаляем комментарии
		$objComment = new Comment();
		while ($objComment->find('first', array('conditions' => 'ID_user = "' . $this->id . '"'))) {
			$objComment->delete();
		}
		// Удаляем отзывы
		$objReview = new Review();
		while ($objReview->find('first', array('conditions' => 'ID_user = "' . $this->id . '"'))) {
			$objReview->delete();
		}
		// Удаляем типовые страницы
		$objTypicalPage = new TypicalPage();
		while ($objTypicalPage->find('first', array('conditions' => 'ID_user = "' . $this->id . '"'))) {
			$objTypicalPage->delete();
		}

		$objDB->delete('`language_user`', array('`ID_user`' => $this->id));
		$objDB->delete('`country_user`', array('`ID_user`' => $this->id));
		$objDB->delete('`city_user`', array('`ID_user`' => $this->id));
		$objDB->delete('`user_variable`', array('`ID_user`' => $this->id));
		$objDB->delete('`session`', array('`ID_user`' => $this->id));
		$objDB->delete('`pressure`', array('`ID_user`' => $this->id));
		$objDB->delete('`order`', array('`ID_user`' => $this->id));
		$objDB->delete('`order`', array('`ID_guide`' => $this->id));
		$objDB->delete('`busy_days`', array('`ID_user`' => $this->id));
		$objDB->delete('`browsing`', array('`ID_user`' => $this->id));
		parent::delete($this->id);
	}

	/**
	 * Возварщает объект текущего пользователя
	 */
	public static function getUser() {
    static $objUser;
    if (!isset($objUser)) {
      $objUser = new User_User(User_User::getId());
    }
    return $objUser;
	}

	/**
	 * Создает пользователя
	 */
	public static function createUserByAdmin($eMail, $login){
		$objDB = Service_Database::instance();//Получаем подключение к БД
    $password = Service_Generate::generatePassword();
		$stmt = "INSERT INTO `user` (`login`, `e_mail`, `pass`, `created_at`, `approved`, `is_employee`) VALUES ('" . $login . "', '" . $eMail . "', '" . md5($password) . "', '" . Service_Date::gLocalTime2BD() . "', '1', '1')";
    $userId = $objDB->queryInsertAutoincrement($stmt);
		return $userId;
	}

  /**
   * Метод возвращает название роли пользователя
   *
   * @param mixed $role - идентификатор роли или название роли
   * @return string
   */
	public static function getRoleName($role) {
	  if (is_numeric($role)) {
  	  switch ($role) {
  	    default: return 'администратор';
  	  }
	  }
	  else return $role;
	}

  /**
   * Возвращает список "подсказанных" логинов по запросу
   *
   * @param string $query
   */
  public static function getSuggested($query) {
    $objDb = Service_Database::instance();
    $searchWords = split(' ', $query);
    $searchStringWhere = '';
    $searchStringWhereFull = '';
    if($searchWords) {
      $searchStringWhere .= " AND ( ";
      $searchStringWhereFull .= " AND ( ";
      for ($i = 0; $i < sizeof($searchWords); $i++) {
        $word = $searchWords[$i];
        if ($i) $searchStringWhere .= " AND ";
        $searchStringWhere .= "(";
          $searchStringWhere .= "UPPER(`last_name`) LIKE UPPER('". $word . "%')";
          $searchStringWhere .= " OR UPPER(`first_name`) LIKE UPPER('". $word . "%')";
          $searchStringWhere .= " OR UPPER(`middle_name`) LIKE UPPER('". $word . "%')";
          $searchStringWhere .= " OR UPPER(`login`) LIKE UPPER('". $word . "%')";
        $searchStringWhere .= ")";
      $searchStringWhere .= " ) ";
        if ($i) $searchStringWhereFull .= " AND ";
        $searchStringWhereFull .= "(";
          $searchStringWhereFull .= "UPPER(`last_name`) LIKE UPPER('%". $word . "%') AND UPPER(`last_name`) NOT LIKE UPPER('". $word . "%')";
          $searchStringWhereFull .= " OR UPPER(`first_name`) LIKE UPPER('%". $word . "%') AND UPPER(`first_name`) NOT LIKE UPPER('". $word . "%')";
          $searchStringWhereFull .= " OR UPPER(`middle_name`) LIKE UPPER('%". $word . "%') AND UPPER(`middle_name`) NOT LIKE UPPER('". $word . "%')";
          $searchStringWhereFull .= " OR UPPER(`login`) LIKE UPPER('%". $word . "%') AND UPPER(`login`) NOT LIKE UPPER('". $word . "%')";
        $searchStringWhereFull .= ")";
      }
      $searchStringWhereFull .= " ) ";
    }
    $stmt = "SELECT `user`.`last_name` AS `surname`, `user`.`first_name` AS `name`, `user`.`middle_name` AS `patronymic`, `user`.`login` AS `login`, `user`.`ID_user` AS `id`
             FROM `user`
             WHERE true " . $searchStringWhere . "
             GROUP BY `name`
             ORDER BY `name` ASC
             LIMIT 0, " . self::$suggestLimit;
    $arrPre = $objDb->select($stmt); //С вхождениями запрос%
    $arrIn = array(); //С вхождениями %запрос%
    if (sizeof($arrPre) < self::$suggestLimit) {
      $stmt = "SELECT `user`.`last_name` AS `surname`, `user`.`first_name` AS `name`, `user`.`middle_name` AS `patronymic`, `user`.`login` AS `login`, `user`.`ID_user` AS `id`
               FROM `user`
               WHERE true " . $searchStringWhereFull . "
               GROUP BY `name`
               ORDER BY `name` ASC
               LIMIT 0, " . (self::$suggestLimit - sizeof($arrPre));
      $arrIn = $objDb->select($stmt);
    }
    return array_merge($arrPre, $arrIn);
  }
  
	/**
	 * Метод формирует список менеджеров
	 *
	 * @return array
	 */
	public static function getAdminsList() {
	  if (!SimpleAdministration::isStrongAdmin()) return array();
	  $objDB = Service_Database::instance();//Получаем подключение к БД
	  $stmt = "SELECT `user`.`ID_user`, `user`.`last_name`, `user`.`first_name`, `user`.`middle_name`
	  FROM `user`
	  WHERE `user`.`is_admin` > 0
	  ORDER BY `user`.`last_name` ASC, `user`.`first_name` ASC, `user`.`middle_name` ASC
	  ";
	  return $objDB->select($stmt);
	}
	  
}
?>
